// 存放登录 和 注册的接口
const express = require('express');
const router = express.Router();

// 加载第三方模块 utility 用于对密码进行加密
const utility = require('utility');
// 加载 db 模块
const db = require('../db');
// 加载 jsonwebtoken 模块 用于生成token字符串
const JWT = require('jsonwebtoken');
// --------------------------  注册接口 -----------------------------------
/* 
    接口要求

        - 请求方式：POST
        - 请求的url：/api`/reguser`
        - 请求体：
        - username -- 账号 字符串、不能有特殊字符、长度2~12位
        - password -- 密码 要求密码长度6~12位
*/
// 自定义错误对象
class joiError extends Error {
    constructor(x) {
        super();
        this.name = 'joiError';
        this.message = x;
    }
};

const Joi = require('@hapi/joi');
const validator = require('express-joi-validation').createValidator({
    passError: true  // true 表示验证出错，会把错误next(err)
});

const querySchema = Joi.object({  // 定义验证规则
    username: Joi.string().alphanum().required().error(new joiError('用户名不规范')),
    password: Joi.string().min(6).max(12).required().error(new joiError('密码长度6~12位'))
});

router.post('/reguser', validator.body(querySchema), async (req, res) => {
    // 使用 req.body 接收请求体
    // console.log(req.body);
    // 对密码进行加密
    req.body.password = utility.md5(req.body.password);
    // 写 insert语句，添加到数据库
    let r = await db('insert into user set?', req.body);
    // 添加成功 r 是一个对象；添加失败 r 是一个undefined
    // console.log(r);
    if (r && r.affectedRows > 0) {
        // 添加成功
        res.send({ status: 0, message: '注册成功' });
    } else {
        // 添加失败
        res.send({ status: 1, message: '注册失败' });
    }
});

// -------------------------  登录接口 -----------------------------------
router.post('/login', async (req, res) => {  // 验证 
    // 获取账号和密码 ，并对密码进行加密 （加密后的密码和数据库中比对）
    let username = req.body.username;
    let password = utility.md5(req.body.password);

    //  console.log(username, password);
    // 执行SQL语句 判断username和password,如果查到结果，说明账号密码正确
    let sql = 'select * from user where username=?and password=?';
    let r = await db(sql, [username, password]);
    //  console.log(r);  // []  表示账号密码错误
    if (r && r.length > 0) {
        let token = 'Bearer ' + JWT.sign(
            { id: r[0].id },  // 需要 token 保存的用户信息
            'bigevent104',  // 加密的key
            { expiresIn: '2 days' }  // 配置，token的有效期
        );
        res.send({ status: 0, message: '登录成功呦', token: token });
    } else {
        res.send({ status: 1, message: '登录失败，账号或密码错误' });
    }

});
module.exports = router;